package br.projecao.bean;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.context.RequestContext;

import br.projecao.dao.AlternativaDAO;
import br.projecao.dao.QuestaoDAO;
import br.projecao.modelo.Alternativa;
import br.projecao.modelo.Questao;

@ManagedBean
@SessionScoped
public class CadastroBean {

	private Questao questao = new Questao();
	private List<Questao> questoes;
	private Alternativa alternativa = new Alternativa();
	private List<Alternativa> alternativas;
	
	public void removeAlternativa() {
		AlternativaDAO alternativaDAO = new AlternativaDAO();
		FacesMessage msg = null;

		try {
			alternativaDAO.excluir(Alternativa.class, alternativa.getId());

			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Excluido com sucesso", null);
		} catch (Exception e) {
			e.printStackTrace();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Erro ao excluir", null);
		}
		limparAlternativa();
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void addAlternativa() {
		AlternativaDAO alternativaDAO = new AlternativaDAO();
		alternativa.setQuestao(questao);
		alternativaDAO.cadastrar(alternativa);
		alternativa = new Alternativa();
		preencheAlternativas();
	}

	public void gravar(ActionEvent actionEvent) {
		QuestaoDAO questaoDAO = new QuestaoDAO();
		RequestContext context = RequestContext.getCurrentInstance();
		FacesMessage msg = null;
		boolean gravado = false;

		try {
			questaoDAO.cadastrar(questao);
			gravado = true;
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Gravado com sucesso", null);

		} catch (Exception e) {
			e.printStackTrace();
			gravado = false;
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Erro ao gravar", null);
		}
		limpar();
		FacesContext.getCurrentInstance().addMessage(null, msg);
		context.addCallbackParam("gravado", gravado);
	}

	public void alterar(ActionEvent actionEvent) {
		QuestaoDAO questaoDAO = new QuestaoDAO();
		RequestContext context = RequestContext.getCurrentInstance();
		FacesMessage msg = null;
		boolean gravado = false;

		try {
			questaoDAO.atualizar(questao);
			gravado = true;
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Alterado com sucesso", null);

		} catch (Exception e) {
			e.printStackTrace();
			gravado = false;
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Erro ao alterar", null);
		}
		limpar();
		FacesContext.getCurrentInstance().addMessage(null, msg);
		context.addCallbackParam("gravado", gravado);
	}

	public void remover() {
		QuestaoDAO questaoDAO = new QuestaoDAO();
		FacesMessage msg = null;

		try {
			questaoDAO.excluir(Questao.class, questao.getId());

			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Excluido com sucesso", null);
		} catch (Exception e) {
			e.printStackTrace();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Erro ao excluir", null);
		}
		limpar();
		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public void limpar() {
		this.questao = new Questao();
		this.questoes = null;
	}

	public void limparAlternativa() {
		this.alternativa = new Alternativa();
		this.alternativas = null;
	}

	public Questao getQuestao() {
		return questao;
	}

	public void setQuestao(Questao questao) {
		this.questao = questao;
	}

	@SuppressWarnings("unchecked")
	public List<Questao> getQuestoes() {
		//if (questoes == null) {
			QuestaoDAO questaoDAO = new QuestaoDAO();
			questoes = questaoDAO.listarTodos(Questao.class);
		//}
		return questoes;
	}

	public void setQuestoes(List<Questao> questoes) {
		this.questoes = questoes;
	}

	public Alternativa getAlternativa() {
		return alternativa;
	}

	public void setAlternativa(Alternativa alternativa) {
		System.out.println("+++++id: "+alternativa.getId());
		this.alternativa = alternativa;
	}

	public List<Alternativa> getAlternativas() {
		return alternativas;
	}

	public void setAlternativas(List<Alternativa> alternativas) {
		this.alternativas = alternativas;
	}

	public void preencheAlternativas() {
		AlternativaDAO alternativaDAO = new AlternativaDAO();
		alternativas = alternativaDAO.buscaPorQuestao(questao);
	}

}
